package com.decent.manager.system.auth.service;

import com.decent.common.bo.MessageBean;
import com.decent.common.entity.manager.SystemUser;
import com.decent.manager.system.auth.jwt.JwtPayLoad;
import com.decent.manager.system.auth.vo.LoginData;
import com.decent.manager.system.auth.vo.LoginUser;
import org.springframework.security.core.Authentication;

import javax.servlet.http.HttpServletRequest;

/**
 * 认证相关service
 *
 * @author 张子旭
 * @date 2022/1/20
 */
public interface AuthService {
    /**
     * 从request获取token
     *
     * @param request request
     * @return token
     */
    String getTokenFromRequest(HttpServletRequest request);

    /**
     * 根据token获取登录用户信息
     *
     * @param token token
     * @return 当前登陆的用户信息
     */
    LoginUser getLoginUserByToken(String token);

    /**
     * 退出登录
     *
     * @return 结果
     */
    MessageBean logout();

    /**
     * 设置SpringSecurityContext上下文，方便获取用户
     *
     * @param loginUser 当前登录用户信息
     */
    void setSpringSecurityContextAuthentication(LoginUser loginUser);

    /**
     * 获取SpringSecurityContext中认证信息
     *
     * @return 认证信息
     */
    Authentication getAuthentication();

    /**
     * 校验token是否正确
     *
     * @param token token
     */
    void checkToken(String token);

    /**
     * 根据系统用户构造用户登陆信息
     *
     * @param sysUser 系统用户
     * @return 用户信息
     **/
    LoginUser genSysLoginUser(SystemUser sysUser);

    /**
     * 缓存token与登录用户信息对应, 2个小时
     *
     * @param loginUser  用户
     * @param jwtPayLoad 用户
     */
    void cacheLoginUser(JwtPayLoad jwtPayLoad, LoginUser loginUser);

    /**
     * 根据系统用户构造用户登陆信息（含导航）
     *
     * @param sysUser 系统用户
     * @return 用户信息
     **/
    LoginData getLoginUserUpToDate(SystemUser sysUser);
}
